#ifndef __SPI_SOFT_H__
#define __SPI_SOFT_H__

#include "gd32f30x.h"

/*************** pin config *****************/
// scl
#define SPI_SOFT_CLK_RCU	RCU_GPIOB
#define SPI_SOFT_CLK_PORT	GPIOB
#define SPI_SOFT_CLK_PIN	GPIO_PIN_13

// MOSI 
#define SPI_SOFT_MOSI_RCU	RCU_GPIOB
#define SPI_SOFT_MOSI_PORT	GPIOB
#define SPI_SOFT_MOSI_PIN	GPIO_PIN_15

// MISO 
#define SPI_SOFT_MISO_RCU	RCU_GPIOB
#define SPI_SOFT_MISO_PORT	GPIOB
#define SPI_SOFT_MISO_PIN	GPIO_PIN_14

// CS 片选 相关配置 写在使用的文件中


/*************** gpio opt ********************/
#define SPI_SOFT_CLK(bit)		 gpio_bit_write(SPI_SOFT_CLK_PORT, SPI_SOFT_CLK_PIN, bit?SET:RESET)
#define SPI_SOFT_MOSI(bit)		 gpio_bit_write(SPI_SOFT_MOSI_PORT, SPI_SOFT_MOSI_PIN,bit?SET:RESET)
#define SPI_SOFT_MISO_STATE()    gpio_input_bit_get(SPI_SOFT_MISO_PORT, SPI_SOFT_MISO_PIN)

/************** spi config *******************/
// SPI 模式 0: SCLK空闲为低电平  在时钟上升沿读数据 在时钟下降沿写数据
//     模式 3: SCLK空闲为高电平  在时钟上升沿读数据 在时钟下降沿写数据
//     模式 1 2 没写
#define SPI_SORT_MODE   0 

#define SPI_SCLK_IDEL_STATE()      ((SPI_SORT_MODE) ? SPI_SOFT_CLK(1) : SPI_SOFT_CLK(0))
#define SPI_SCLK_ACTIVE_STATE()    ((SPI_SORT_MODE) ? SPI_SOFT_CLK(0) : SPI_SOFT_CLK(1))


/**
 * @desc  : 初始化
 * @date  : 2025-04-24
 * @author: AnRui
 * @note  :
 */
void SpiSoftInit(void);

/**
 *  @desc  :软实现方式 发送读取spi数据
 * @date  : 2025-02-28
 * @author: AnRui
 * @param :  data - {参数说明}:
 * @return: uint8_t
 * @note  : 正常是 scl上升沿的时候 读取数据 因为是手动 所有没办法
 *          所以在统一在scl高电平的时候读和写 不影响
 *          在拉高之前就准备好数据
 */
uint8_t SpiSoftReadWriteByte(uint8_t data);

#endif
